package com.sun.module_network

/**
 * 错误码枚举类，用于定义和获取各种错误的代码和描述信息
 *
 * @author sunc
 * @time 2025/7/18 13:40
 * @desc 错误码和描述
 */
//enum class ERROR(private val code: Long, private val err: String) {
//
//    /**
//     * 未知错误
//     */
//    UNKNOWN(1000, "未知错误"),
//
//    /**
//     * 未知错误，有错误信息
//     */
//    UNKNOWN_WITH_MESSAGE(1000, "未知错误，有错误信息"),
//
//    /**
//     * 解析错误
//     */
//    PARSE_ERROR(1001, "解析错误"),
//
//    /**
//     * 网络错误
//     */
//    NETWORK_ERROR(1002, "网络错误"),
//
//    /**
//     * 证书错误
//     */
//    SSL_ERROR(1003, "证书错误"),
//
//    /**
//     * 网络不可用
//     */
//    UNKNOWN_HOST(1005, "网络不可用"),
//
//    /**
//     * 连接超时
//     */
//    TIMEOUT(1000, "连接超时"),
//
//    /**
//     * 服务器发生错误
//     */
//    HTTP_ERROR_500(500, "服务器发生错误"),
//
//    /**
//     * 服务器作为网关或者代理时，为了完成请求访问下一个服务器，但该服务器返回了非法的应答
//     */
//    HTTP_ERROR_502(502, "502"),
//
//    /**
//     * 服务器由于维护或者负载过重未能应答
//     */
//    HTTP_ERROR_503(503, "503"),
//
//    /**
//     * 由作为代理或网关的服务器使用，表示不能及时地从远程服务器获得应答
//     */
//    HTTP_ERROR_504(504, "504"),
//
//    /**
//     * 请求地址不存在
//     */
//    HTTP_ERROR_404(404, "请求地址不存在"),
//
//    /**
//     * HTTP 403
//     */
//    HTTP_ERROR_403(403, "HTTP 403"),
//
//    /**
//     * HTTP 402
//     */
//    HTTP_ERROR_402(402, "HTTP 402"),
//
//    /**
//     * 未授权
//     */
//    HTTP_ERROR_401(401, "HTTP 401"),
//
//    /**
//     * 请求被重定向到其它页面
//     */
//    HTTP_ERROR_307(307, "请求被重定向到其它页面"),
//
//    /**
//     * 协议异常
//     */
//    HTTP_ERROR(1007, "协议异常"),
//
//    /**
//     */
//    HTTP_CANCEL(2000, "请求已取消或超时"),
//
//    /**
//     * 其它错误，有错误信息
//     */
//    HTTP_OTHER(3000, "其它错误，有错误信息");
//
//    /**
//     * 获取错误描述信息
//     * @return 错误描述信息字符串
//     */
//    fun getValue() = err
//
//    fun getKey() = code
//}
/**
 * 错误级别枚举
 */
enum class ErrorLevel {
    INFO,    // 信息级别
    WARNING, // 警告级别
    ERROR,   // 错误级别
    FATAL    // 严重错误级别
}
/**
 * 错误码管理类
 */
sealed class Error(val code: Long, val defaultMessage: String, val level: ErrorLevel) {

    // 网络相关错误
    object NETWORK_ERROR : Error(1000, "网络连接错误", ErrorLevel.ERROR)
    object TIMEOUT : Error(1001, "请求超时", ErrorLevel.ERROR)
    object SSL_ERROR : Error(1002, "SSL证书错误", ErrorLevel.ERROR)
    object UNKNOWN_HOST : Error(1003, "未知主机", ErrorLevel.ERROR)

    // HTTP相关错误
    object HTTP_ERROR_500 : Error(2001, "服务器内部错误", ErrorLevel.ERROR)
    object HTTP_ERROR_404 : Error(2002, "资源不存在", ErrorLevel.ERROR)
    object HTTP_ERROR_403 : Error(2003, "禁止访问", ErrorLevel.ERROR)
    object HTTP_ERROR_402 : Error(2004, "需要付费", ErrorLevel.ERROR)
    object HTTP_ERROR_307 : Error(2005, "临时重定向", ErrorLevel.WARNING)
    object HTTP_ERROR_401 : Error(2006, "未授权", ErrorLevel.ERROR)
    object HTTP_ERROR : Error(2007, "HTTP请求错误", ErrorLevel.ERROR)

    // 解析相关错误
    object PARSE_ERROR : Error(3001, "数据解析错误", ErrorLevel.ERROR)

    // 业务相关错误
    object BUSINESS_ERROR : Error(4001, "业务逻辑错误", ErrorLevel.ERROR)

    // 系统相关错误
    object UNKNOWN : Error(5000, "未知错误", ErrorLevel.FATAL)
    object UNKNOWN_WITH_MESSAGE : Error(5001, "未知错误: %s", ErrorLevel.FATAL)

    object HTTP_CANCEL : Error(6000, "请求已取消或超时", ErrorLevel.FATAL)

    /**
     * 获取错误消息，支持格式化
     * @param args 格式化参数
     * @return 格式化后的错误消息
     */
    fun getMessage(vararg args: Any): String {
        return if (defaultMessage.contains("%s")) {
            defaultMessage.format(*args)
        } else {
            defaultMessage
        }
    }

    companion object {
        /**
         * 根据错误码获取错误类型
         */
        fun getByCode(code: Int): Error? = when (code) {
            1000 -> NETWORK_ERROR
            1001 -> TIMEOUT
            1002 -> SSL_ERROR
            1003 -> UNKNOWN_HOST
            2001 -> HTTP_ERROR_500
            2002 -> HTTP_ERROR_404
            2003 -> HTTP_ERROR_403
            2004 -> HTTP_ERROR_402
            2005 -> HTTP_ERROR_307
            2006 -> HTTP_ERROR_401
            2007 -> HTTP_ERROR
            3001 -> PARSE_ERROR
            4001 -> BUSINESS_ERROR
            5000 -> UNKNOWN
            5001 -> UNKNOWN_WITH_MESSAGE
            else -> null
        }
    }
}
